package com.mq.service;

import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;

import com.mq.vo.QaAuditReqVO;

/**
 *   定义一个交换器名称：广播消息，只要有人绑定了这个广播器，所有人都能接受到消息
 * 
 * @author Administrator
 *
 */
@Configuration
@Service
public class MQExchangeFanoutService {
	
	@Autowired
	RabbitTemplate rabbitTemplate;
	
	//定义一个交换器名称（广播，扇形）
	public static final String EX_NAME="my-exchange-fanout";
	//定义一个交换器名称绑定的消息队列名称1
	public static final String EX_NAME_MQ_NAME_1="my-exchange-fanout-mq-1";
	//定义一个交换器名称绑定的消息队列名称2
	public static final String EX_NAME_MQ_NAME_2="my-exchange-fanout-mq-2";

	/**
	  *    发送消息到交换器中，然后交换器分发到绑定这个交换器的队列
	 * @param qaAuditReqVO
	 */
	public void send(QaAuditReqVO qaAuditReqVO) {
		//发送mq到一个交换器中，第一个参数是交换机名称，第二参数是路由器名称（这个名称可以指定或者为空字符串）
		rabbitTemplate.convertAndSend(EX_NAME,"", qaAuditReqVO);
	}
	
	/**
	  * 创建第一个消息端监听器，绑定一个广播交换机以及队列名称
	  * 如果下面的交换器名称，路由名称不存在，系统在启动的时候会自动创建
	 * @param qaAuditReqVO
	 */
	@RabbitListener(bindings = {
			 @QueueBinding(value =@Queue(name = EX_NAME_MQ_NAME_1),//指定队列名称
			               exchange =@Exchange(name = EX_NAME,type = ExchangeTypes.FANOUT))//指定交换器名称且是一个扇形交换器，相关于一个广播
	})
	public void receiveFANOUT1(QaAuditReqVO qaAuditReqVO) {
		System.out.println(EX_NAME_MQ_NAME_1+"<====接收到简单消息："+qaAuditReqVO.getNo());
	}
	
	/**
	  * 创建第二消息端监听器，绑定一个广播交换机以及队列名称
	 * @param qaAuditReqVO
	 */
	@RabbitListener(bindings = {
			 @QueueBinding(value =@Queue(name = EX_NAME_MQ_NAME_2),//指定队列名称
			               exchange =@Exchange(name = EX_NAME,type = ExchangeTypes.FANOUT))//指定交换器名称且是一个扇形交换器，相关于一个广播
	})
	public void receiveFANOUT2(QaAuditReqVO qaAuditReqVO) {
		System.out.println(EX_NAME_MQ_NAME_2+"<====接收到简单消息2："+qaAuditReqVO.getNo());
	}
	

}
